/*
 * Copyright © 2020 www.noark.xyz All Rights Reserved.
 * 
 * 感谢您选择Noark框架，希望我们的努力能为您提供一个简单、易用、稳定的服务器端框架 ！
 * 除非符合Noark许可协议，否则不得使用该文件，您可以下载许可协议文件：
 * 
 * 		http://www.noark.xyz/LICENSE
 *
 * 1.未经许可，任何公司及个人不得以任何方式或理由对本框架进行修改、使用和传播;
 * 2.禁止在本项目或任何子项目的基础上发展任何派生版本、修改版本或第三方版本;
 * 3.无论你对源代码做出任何修改和改进，版权都归Noark研发团队所有，我们保留所有权利;
 * 4.凡侵犯Noark版权等知识产权的，必依法追究其法律责任，特此郑重法律声明！
 */
package com.company.qqsg.module.user.service;

import static xyz.noark.log.LogHelper.logger;

import java.util.HashMap;
import java.util.Map;

import com.company.qqsg.core.JsonHelper;
import com.company.qqsg.core.JsonHelper.State;
import com.company.qqsg.module.user.domain.UserInfo;
import com.company.qqsg.module.user.domain.UserInfoRepository;
import com.company.qqsg.module.user.proto.CreateRoleReq;
import com.company.qqsg.module.user.proto.LoginReq;
import com.company.qqsg.module.user.proto.LoginRoleReq;

import xyz.noark.core.annotation.Autowired;
import xyz.noark.core.annotation.Service;
import xyz.noark.core.network.Session;
import xyz.noark.core.network.SessionManager;
import xyz.noark.network.SocketSession;

/**
 * 用户相关业务逻辑处理类
 *
 * @author 小流氓(176543888@qq.com)
 */
@Service
public class UserService {

	@Autowired
	private UserInfoRepository userInfoRepository;

	/**
	 * 登录游戏
	 */
	public String login(SocketSession session, LoginReq req) {
		logger.debug("登录请求 uid={}", req.getSid());
		UserInfo entity = userInfoRepository.cacheLoad(req.getSid()).orElseGet(() -> createUser(req));

		// 没有核验登录是否正常，直接就以sid为用户唯一ID了.
		session.setUid(entity.getUid());
		session.setState(Session.State.AUTHENTICATED);

		// 绑定UID与Session关系，如果之前在线就要走T人流程
		SessionManager.setUidAndSession(entity.getUid(), session).ifPresent(s -> kickout(s));

		return JsonHelper.buildSuccess("userId", entity.getUid());
	}

	private UserInfo createUser(LoginReq req) {
		UserInfo entity = new UserInfo();
		entity.setUid(req.getSid());
		userInfoRepository.cacheInsert(entity);
		return entity;
	}

	/**
	 * 顶号T人操作.
	 */
	private void kickout(Session session) {
		logger.info("自己顶号，uid={}", session.getUid());
		session.clearUidAndPlayerId();
		session.close();
	}

	public String loginRole(String uid, LoginRoleReq req) {
		Map<String, Object> data = new HashMap<>();
		data.put("sessionKey", "11111111111");
		data.put("userId", "1");
		data.put("uniqueId", "123");
		data.put("serverId", 111);
		data.put("playerId", 1);
		data.put("playerName", "哈哈");
		data.put("forceId", 0);
		data.put("playerLv", 1);
		data.put("serverTime", Long.valueOf(System.currentTimeMillis()));
		data.put("createTime", Long.valueOf(System.currentTimeMillis()));
		data.put("spendMoney", 11111);
		data.put("languageId", 1);
		return JsonHelper.build(State.SUCCESS, data);
	}

}
